package com.cam.framework.system.dept.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cam.framework.crud.CrudTreeService;
import com.cam.framework.system.dept.domain.SysDeptDTO;
import com.cam.framework.system.dept.entity.SysDept;
import com.cam.framework.system.dept.mapper.SysDeptMapper;
import com.cam.framework.system.dept.mapstruct.SysDeptMapStruct;
import com.cam.framework.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class SysDeptService extends CrudTreeService<SysDeptDTO, SysDept, SysDeptMapper> {

    private final SysDeptMapStruct sysDeptMapStruct;

    public SysDeptService(SysDeptMapper sysDeptMapper, SysDeptMapStruct sysDeptMapStruct) {
        super(sysDeptMapper);
        this.sysDeptMapStruct = sysDeptMapStruct;
    }

    public SysDeptDTO findById(String id) {
        return mapper.findById(id);
    }

    public boolean save(SysDeptDTO sysDeptDTO) {
        SysDeptDTO parent;
        // 如果传进来的对象没有 parentId 或者等于 rootId，说明是根元素，则赋值 parent 为 root
        if (sysDeptDTO.getRootId().equals(sysDeptDTO.getParentId()) || StringUtils.isBlank(sysDeptDTO.getParentId())) {
            parent = new SysDeptDTO(sysDeptDTO.getRootId()); // parentId 为 rootId
            parent.setParentIds("");
//            sysDeptDTO.setParentIds(sysDeptDTO.getRootId()); // parentIds 为 rootId
        } else {
            parent = findById(sysDeptDTO.getParentId());
        }

        sysDeptDTO.setParentIds(String.join(",", new String[]{parent.getParentIds(), parent.getId()}).replaceAll("^,|,$", "")); // ^,|,$ 表示开头或结尾的逗号，根节点会出现开头逗号
        sysDeptDTO.setParent(parent);
        SysDept sysDept = sysDeptMapStruct.toEntity(sysDeptDTO);
        return super.save(sysDept);
    }

    public boolean update(SysDeptDTO sysDeptDTO) {
        SysDept sysDept = sysDeptMapStruct.toEntity(sysDeptDTO);
        LambdaUpdateWrapper<SysDept> updateWrapper = new LambdaUpdateWrapper<>();
//        updateWrapper.set
        return super.updateById(sysDept);
    }

    public boolean saveOrUpdate(SysDeptDTO sysDeptDTO) {
        if (StringUtils.isEmpty(sysDeptDTO.getId())) {
            // 新增
            return this.save(sysDeptDTO);
        } else {
            return this.update(sysDeptDTO);
        }
    }

}
